package features.advance.jdk.concurrent;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author LIN
 * @date 2022-11-28 15:28
 *
 *  基于HiKariCP组件，分析连接池原理
 *
 *  一、设计与原理
 * 1、基础案例
 * HiKariCP作为SpringBoot2框架的默认连接池，号称是跑的最快的连接池，
 * 数据库连接池与之前两篇提到的线程池和对象池，
 * 从设计的原理上都是基于池化思想，只是在实现方式上有各自的特点；
 * 首先还是看HiKariCP用法的基础案例：
 */
public class ConPool {

    public static void main(String[] args) throws SQLException {
        // 构建数据源
        HikariDataSource dataSource = new HikariDataSource(buildConfig());
        // 获取连接
        Connection connection = dataSource.getConnection();
        // 声明SQL执行
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select count(1) num from fun_baseinfo");
        if(resultSet.next()){
            System.out.println("query-count-result:"+resultSet.getInt("num"));
        }



    }

    private static HikariConfig buildConfig(){
        HikariConfig hikariConfig = new HikariConfig();
        // 基础配置
        hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/puyun_shdl_v1?characterEncoding=UTF8&serverTimezone=Asia/Shanghai");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        // 连接池配置
        hikariConfig.setPoolName("dev-hikari-pool");
        hikariConfig.setMinimumIdle(4);
        hikariConfig.setMaximumPoolSize(8);
        hikariConfig.setIdleTimeout(600000L);
        return hikariConfig;
    }

}
